#!/bin/bash
# **********************************************************
# * Author : liangliangSu
# * Email : sll917@hotmail.com
# * Create time : 2023-01-30 10:26
# * Filename : 07变量运算.sh
# **********************************************************
: '
为什么需要变量运算？
场景① 程序中出现计算的程序；
场景② 单位换算
场景③ ......
和其他编程语言类似，Shell也有很多算数运算符号，我在网上找到了一些常见的！

Shell中常见的运算命令
expr 可用于整数运算，有其他额外的功能；
$(( ))  效率高的整数运算常用运算符；
let 类似 (())
$[ ]  用于整数运算；
bc   linux下的一个计算器程序，用于小数运算
awk 小数或整数运算
daclare  定义变量值和属性 -i参数可以用以定义整形变量，做运算；
'
echo '(1)-----------------------完美分割线--------------------------------'
#演示：(())
#双小括号，进行数值运算与数值比较，效率高，用法灵活。
#但是双小括号对对于小数来说，只能四舍五入！
echo $((5+5))
echo $((5-7))
echo $((5*7))
echo $((10/2))
echo $((10/3))
echo '(2)-----------------------完美分割线--------------------------------'
#双小括号除了可以运算整数类型，还可以做判断！
#１表示真；
#０表示假；
echo $((10 < 14))
echo $((10 < 10))
echo $((10 = 10))
echo $((10 == 10))
echo '(3)-----------------------完美分割线--------------------------------'
#双小括号弊端就是不能对小数（浮点数）或字符串，那么来看看awk怎么取值小数，小数位竟然保留了5位；
awk 'BEGIN {print 10/3}'
#双小括号怎么取余数
echo $((20%3))
echo $((10%3))
#除了用双小括号来做计算功能，还可以用中括号，因人而异，初级阶段没有什么区别！
echo $[10+5]

#++ --特殊运算符配合双小括运算
#这里变量名fx=10，遇到了((++fx))
#变量名在++的后面，在输出整个表达式时，先进行自增/自减运算，因为发fx为10 且要自增1，所以输出为11；
fx=10
echo $((++fx))
echo ${fx}
echo $((--fx))
#这里变量名fx=11，遇到了((fx++))
#变量名在++的前面，在输出整个表达式时，会输出fx的值，fx=11，所以输出为11；--也是这样推理的！
fx=10
echo $((++fx))
echo ${fx}
echo $((fx++))

echo '(1)-----------------------完美分割线--------------------------------'
#根据当前时间计算明年时间
#编写思路：先获取当前时间 +%F 是完整的年月日！
#然后在定义变量今年是哪一年，最后利用运算符来进行递增运算，看起来是不是很简单
echo "今年是 $(date +%Y),明年是 $[ $(date +%Y) +1 ]"
echo "今年是 $(date +%Y),明年是 $(( $(date +%Y) +1 ))"
echo "今年是 $(date +%Y),后年是 $(( $(date +%Y) +2 ))"

#利用变量运算计算今年还剩下多少周？
#根据系统时间获取今年还剩下多少个星期，已经过了多少星期？
#编写思路：
#还剩多少个星期如何计算？
#首先，要计算开年到现在的时间已经过了多少天；
#然后，在用365减去过了多少天并除以7得到了剩余的星期；
#再次，求已经过了多少星期，就是用过了多少天除以7即可；
#最后，用365减去过了多少天得到距离新年的天数；
#总之，得到这些数值的前提，一定是要获取到已经过了多少天的天数，否则后面的一些求值会失败！
#通过对date的命令参数帮助得到 %j能获取到过了多少天
: '
date --help
给定的格式FORMAT 控制着输出，解释序列如下：

  %%	一个文字的 %
  %a	当前locale 的星期名缩写(例如： 日，代表星期日)
  %A	当前locale 的星期名全称 (如：星期日)
  %b	当前locale 的月名缩写 (如：一，代表一月)
  %B	当前locale 的月名全称 (如：一月)
  %c	当前locale 的日期和时间 (如：2005年3月3日 星期四 23:05:25)
  %C	世纪；比如 %Y，通常为省略当前年份的后两位数字(例如：20)
  %d	按月计的日期(例如：01)
  %D	按月计的日期；等于%m/%d/%y
  %e	按月计的日期，添加空格，等于%_d
  %F   完整日期格式，等价于 %+4Y-%m-%d
  %g   ISO-8601 格式年份的最后两位（参见 %G）
  %G   ISO-8601 格式年份（参见 %V），一般只和 %V 结合使用
  %h	等于%b
  %H	小时(00-23)
  %I	小时(00-12)
  %j	按年计的日期(001-366)
 ... 
'
echo '(2)-----------------------完美分割线--------------------------------'
day1=$(date +%j)  #1.距离新年剩余多少天
echo "距离新年还剩下：$[ 365 - ${day1#*0} ] "
echo "已经过了多少个星期：$[ ${day1#*0}/7 ]"
echo "还剩下多少个星期：$[(365 - ${day1#*0}) /7 ] "
